package com.demo.Controller;

import com.demo.Service.UserService;
import com.demo.common.MessageUtils;
import com.demo.entity.User;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.UUID;

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    UserService userService;

    ArrayList<User> users = new ArrayList<>();

    @GetMapping
    public MessageUtils<PageInfo<User>> save(@RequestParam(defaultValue = "1") int pn,
                                             @RequestParam(defaultValue = "4") int number,
                                             @RequestParam(defaultValue = "") String str) {
        return userService.SelectAll(pn, number, str);
    }

    @PostMapping
    public MessageUtils<?> InsertUse(@RequestBody User user) {

        //生成随机id
        UUID uuid = UUID.randomUUID();
        user.setId(String.valueOf(uuid));

        if (user.getPassword() == null||user.getPassword().equals("")) {
            //设置账号密码
            user.setPassword("123456");
        }
        if (user.getAddress() == null) user.setAddress("未知");
        if (user.getAge() == null) user.setAge(0);


        users.add(user);
        MessageUtils<Integer> inserts = userService.Inserts(users);
        users.remove(user);
        return inserts;
    }

    @PutMapping
    public MessageUtils<?> updateUse(@RequestBody User user) {

        return userService.updateUser(user);
    }

    //DeleteMapping请求，不能使用@RequestParam，只能使用路径变量
    @DeleteMapping("/{id}")
    public MessageUtils<?> deleteUser(@PathVariable("id") String id) {
        return userService.deleteUser(id);
    }

    @PostMapping("/login")
    public MessageUtils<?> login(
            @RequestBody User user
            //@RequestParam(name = "username") String username,
            //@RequestParam(name = "password") String password
    ) {
        // @RequestParam注解，默认只能获取到路径中的变量，而put和post，delete请求，
        // 他们的参数都是放在请求体中，所以无法获取到我们可以使用@RequestBody注解，
        // 来获取请求体中的参数，然后封装到一个对象中，或者map中

        //@RequestBody可以用来接收http post请求的body，前端传入序列化好的json数据，
        // 后端可以解析为json对象（Content-Type需要指定为 application/json）。

        // @RequestParam用来接收请求url?后面的参数，或者Content-Type
        // 为multipart/form-data、application/x-www-form-urlencoded时的http body数据。

        //application/x-www-form-urlencoded是以表格的形式请求，而application/json则将数据序列
        // 化后才进行传递，如果使用了@RequestParam会在Content里面查找对应的数据，结果因为传递
        // 的数据已经被序列化所以不能找到，所以当要使用@RequestParam注解时候
        // 应当使用application/x-www-form-urlencoded，而如果想要使用application/json则
        // 应当使用@RequestBody获取被序列化的参数

        //如果前端使用的是axios传递的参数，那么我们需要在前端进行处理传递过来的参数，不然直接传递参数给
        //axios，进行传递由于传递的是一个json对象的形式，那么就会触发axios的对对象的处理方式，导致我们
        //后台接收不到参数，我们可以使用URLSearchParams对象，通过这个对象的append函数，将参数名，和参数值
        //放到这个对象中，然后将这个对象传递给我们后端，
        // 详细配置：https://blog.csdn.net/csdn_yudong/article/details/79668655
        //如果前端使用了自己封装axios的request工具 那么就需要在分装文件中，
        // 自己加入application/x-www-form-urlencoded和multipart/form-data
        //但是这样，会导致其他正常的请求，无法正常执行，所有还是使用 @RequestBody注解。。。

        return userService.SelectUser(user.getUsername(), user.getPassword());
    }

}
